package pl.edu.mimuw.mas.agent.behaviour.helicopter.verification;

import jade.content.lang.Codec.CodecException;
import jade.content.onto.OntologyException;
import jade.content.onto.UngroundedException;
import jade.core.AID;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.lang.acl.UnreadableException;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import pl.edu.mimuw.mas.agent.HelicopterAgent;
import pl.edu.mimuw.mas.agent.behaviour.ServerBehaviour;

/**
 * Zachowanie wyczejujące na wynki weryfikacji.
 */
public class ListenVerifyBehaviour extends ServerBehaviour {
	private static final long serialVersionUID = 8660639912056314045L;
	private final Logger logger = LoggerFactory.getLogger(getClass());
	
	public ListenVerifyBehaviour(HelicopterAgent agent, AID sender) {
		super(agent);
		
		MessageTemplate mt = MessageTemplate.and(
				MessageTemplate.and(
						MessageTemplate.MatchConversationId(HelicopterAgent.HELICOPTER_VERIFY_CONV),
						MessageTemplate.MatchSender(sender)
				),
				MessageTemplate.or(
						MessageTemplate.MatchPerformative(ACLMessage.CONFIRM), 
						MessageTemplate.MatchPerformative(ACLMessage.DISCONFIRM)
				)
		);
		setMessageTemplate(mt);
	}
	
	public boolean doAction(ACLMessage msg, ACLMessage reply) throws UngroundedException, CodecException, OntologyException, UnreadableException, IOException {
		HelicopterAgent ha = (HelicopterAgent) myAgent;
		
		if(msg.getPerformative() == ACLMessage.DISCONFIRM) {
			logger.info("{}: Agent {} wykluczył obecność łosia", ha.getName(), msg.getSender().getName());
			ha.log("Agent " + msg.getSender().getName() + " wykluczył obecność łosia");
			ha.doPatrol();
		}
		
		if(msg.getPerformative() == ACLMessage.CONFIRM) {
			logger.info("{}: Agent {} potwierdził obecność łosia", ha.getName(), msg.getSender().getName());
			ha.log("Agent " + msg.getSender().getName() + " potwierdził obecność łosia");
			ha.doBroadCast();
		}

		stop();
		return false;
	}	
}
